package com.triadsystems.cashweb.modelo.negocio.dominios.impl;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import com.icon.infra.modelo.negocio.excecoes.ConsultaInvalidaException;
import com.icon.infra.modelo.negocio.excecoes.ObjetoNaoEncontradoException;
import com.icon.infra.utils.ICONUtil;
import com.triadsystems.cashweb.modelo.negocio.dominios.ICaixaDominio;
import com.triadsystems.cashweb.modelo.negocio.servicos.ICaixaServico;
import com.triadsystems.cashweb.modelo.negocio.servicos.IMovimentacaoServico;
import com.triadsystems.cashweb.modelo.negocio.servicos.IPagamentoServico;
import com.triadsystems.cashweb.modelo.persistencia.entidades.ArrecadacaoCaixa;
import com.triadsystems.cashweb.modelo.persistencia.entidades.Caixa;
import com.triadsystems.cashweb.modelo.persistencia.entidades.Movimentacao;
import com.triadsystems.cashweb.modelo.persistencia.entidades.Usuario;
import com.triadsystems.cashweb.modelo.persistencia.enums.TipoMovimentacaoEnum;

@Named
public class CaixaDominio implements ICaixaDominio, Serializable {
	private static final long serialVersionUID = 1L;

	@Inject
	private ICaixaServico caixaServico;
	
	@Inject
	private IPagamentoServico pagamentoServico;

	@Inject
	private IMovimentacaoServico movimentacaoServico;
	
	public List<ArrecadacaoCaixa> getListaMovimentacao() throws Exception {
		List<ArrecadacaoCaixa> r;
		Usuario usuario = ICONUtil.getUsuarioLogado();
		Caixa caixa = caixaServico.recuperarCaixaUsuarioAberto(usuario);
//		r = (List<ArrecadacaoCaixa>) pagamentoServico.getMovimentoDiarioPorArrecadador(caixa);
		r = null;
		
		return r;
	}

	public Integer getQtdDoc() throws Exception{
	List<ArrecadacaoCaixa> r= 	getListaMovimentacao();
		Integer qtdTotalDocs = new Integer(0);
		for(ArrecadacaoCaixa arrecadacaoCaixa : r){
			qtdTotalDocs += arrecadacaoCaixa.getQuantidade();
		}
		return qtdTotalDocs;
	}

	public BigDecimal getTotalArrecadado() throws Exception{
		List<ArrecadacaoCaixa > r = null;
		BigDecimal total = new BigDecimal(0);
		for (ArrecadacaoCaixa arrecadacaoCaixa : r) {
			total =total.add(arrecadacaoCaixa.getValor());
		}
		
		total = total.setScale(2, BigDecimal.ROUND_HALF_UP);
		
		return total;
	}

	@SuppressWarnings("unchecked")
	public List<Movimentacao> getQtdeEstorno(Caixa caixa) throws ObjetoNaoEncontradoException, ConsultaInvalidaException { 
		List<Movimentacao> resultado = null;

		String hql = "from Movimentacao m"
				+ " where m.tipoMovimentacao = :status1"
				+ " and m.caixa.id = :caixa_id";

		String[] params = { "status1", "caixa_id" };
		Object[] valores = { TipoMovimentacaoEnum.ESTORNO, caixa };

		resultado = (List<Movimentacao>) movimentacaoServico.recuperarObjetosPorHQL(hql, params, valores);

		return resultado;
	}


	@SuppressWarnings("unchecked")
	public List<Movimentacao> getQtdeRecebimento(Caixa caixa) throws ObjetoNaoEncontradoException, ConsultaInvalidaException {
		List<Movimentacao> resultado = null;
		
		String hql = "from Movimentacao m"
				+ " where m.tipoMovimentacao = :status1"
				+ " and m.caixa.id = :caixa_id";
		
		String[] params = { "status1", "caixa_id" };
		Object[] valores = { TipoMovimentacaoEnum.RECEBIMENTO, caixa };
		
		resultado = (List<Movimentacao>) movimentacaoServico.recuperarObjetosPorHQL(hql, params,
				valores);
		
		return resultado;
	}
	
	@SuppressWarnings("unchecked")
	public List<Movimentacao> getQtdeRetirada(Caixa caixa) throws ObjetoNaoEncontradoException, ConsultaInvalidaException {
		List<Movimentacao> resultado = null;

		String hql = "from Movimentacao m"
				+ " where m.tipoMovimentacao = :status1"
				+ " and m.caixa.id = :caixa_id";

		String[] params = { "status1", "caixa_id" };
		Object[] valores = { TipoMovimentacaoEnum.RETIRADA, caixa };

		resultado = (List<Movimentacao>) movimentacaoServico.recuperarObjetosPorHQL(hql, params, valores);

		return resultado;
	}

	@SuppressWarnings("unchecked")
	public List<Movimentacao> getQtdeDevolucao(Caixa caixa) throws ObjetoNaoEncontradoException, ConsultaInvalidaException {
		List<Movimentacao> resultado = null;

		String hql = "from Movimentacao m"
				+ " where m.tipoMovimentacao = :status1"
				+ " and m.caixa.id = :caixa_id";

		String[] params = { "status1", "caixa_id" };
		Object[] valores = { TipoMovimentacaoEnum.DEVOLUCAO, caixa };

		resultado = (List<Movimentacao>) movimentacaoServico.recuperarObjetosPorHQL(hql, params, valores);

		return resultado;
	}

	@SuppressWarnings("unchecked")
	public List<Movimentacao> getQtdeDevolucaoByData(Usuario usuario, Calendar dataInicio, Calendar dataFim) throws ObjetoNaoEncontradoException, ConsultaInvalidaException {
		List<Movimentacao> resultado = null;

		String hql = "from Movimentacao m"
				+ " where m.tipoMovimentacao = :status2" 
				+ " and m.caixa.usuario.id = :usuario_id"
				+ " and m.dtaMovimentacao between :dataInicio and :dataFim";

		String[] params = { "status2", "usuario_id", "dataInicio", "dataFim" };
		Object[] valores = { TipoMovimentacaoEnum.DEVOLUCAO, usuario , dataInicio, dataFim };

		resultado = (List<Movimentacao>) movimentacaoServico.recuperarObjetosPorHQL(hql, params, valores);

		return resultado;
	}

	@SuppressWarnings("unchecked")
	public List<Movimentacao> getQtdeEstornoByData(Usuario usuario, Calendar dataInicio, Calendar dataFim) throws ObjetoNaoEncontradoException, ConsultaInvalidaException {
		List<Movimentacao> resultado = null;
		
		String hql = "from Movimentacao m"
				+ " where m.tipoMovimentacao = :status3" 
				+ " and m.caixa.usuario.id = :usuario_id"
				+ " and m.dtaMovimentacao between :dataInicio and :dataFim";
		
		String[] params = { "status3", "usuario_id", "dataInicio", "dataFim" };
		Object[] valores = { TipoMovimentacaoEnum.ESTORNO, usuario , dataInicio, dataFim };
		
		resultado = (List<Movimentacao>) movimentacaoServico.recuperarObjetosPorHQL(hql, params, valores);
		
		return resultado;
	}
}
